package br.com.werp.regras.documento.integracao;

import br.com.werp.regras.geral.ErroPadrao;
import br.com.werp.regras.geral.integracao.MasterDAO;
import br.com.werp.regras.geral.interfaces.algoritimo.IdVirtual;
import br.com.werp.regras.geral.util.Constantes;
import br.com.werp.regras.geral.util.Dia;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.documento.DocumentoVecimentoAgrupadoVO;
import br.com.werp.regras.geral.vos.documento.DocumentoVencimentoPesquisaVO;
import br.com.werp.regras.geral.vos.documento.DocumentoVencimentoVO;
import br.com.werp.regras.geral.vos.tabelas.Documento_vencimento;

import java.sql.Connection;
import java.sql.SQLException;

import java.util.List;


/**
 * @author Sobreira
 * Criado em 24/11/2004
 *
 */
public class VencimentoDAO extends MasterDAO {
    private static VencimentoDAO vencimentoDAO;

    private VencimentoDAO(String banco) throws Exception {
        super(banco);
    }

    public static VencimentoDAO getVencimentoDAO() throws Exception {
        if (vencimentoDAO == null) {
            vencimentoDAO = new VencimentoDAO(Constantes.BANCO);
        }

        return vencimentoDAO;
    }

    public List pesquisarVencimentosVO(String dtVencInicio, String dtVencFim,
        DocumentoVencimentoPesquisaVO VO) throws Exception {
        Connection conn = null;

        try {
            conn = getConexao();

            Dia dInicio = new Dia(Util.stringtoTimestamp(dtVencInicio));
            Dia dFim = new Dia(Util.stringtoTimestamp(dtVencFim));

            String tabelas =
                " documento_vencimento , documento , agrupamento_documento " +
                ", tipo_documento , dominio ";

            String where =
                " and dcve_id = docm_id and apdo_doc_agrupado = docm_id " +
                " and docm_tipo = tdoc_id and tdoc_dominio = domi_id";

            if (!Util.isNullOrEmpty(dtVencInicio)) {
                where += (" and (dcve_data >= " + dInicio.getDataBanco() + ")");
                VO.setDcve_data(null);
            }

            if (!Util.isNullOrEmpty(dtVencFim)) {
                where += (" and (dcve_data <= " + dFim.getDataBanco() + ")");
                VO.setDcve_data(null);
            }

            return pesquisarVO(conn, VO, where, tabelas,
                DocumentoVencimentoPesquisaVO.EXCLUIDAS);
        } finally {
            liberaConeccao(conn);
        }
    }

    public List obterVencimentosAgrupados(Object key,
        DocumentoVecimentoAgrupadoVO documentoVecimentoAgrupadoVO)
        throws Exception {
        Connection connection = null;

        if (key == null) {
            connection = getConexao();
        } else {
            connection = validarTransacao(key);
        }

        String where =
            " and dcve_id = docm_id and apdo_doc_agrupado = docm_id ";
        String tabelas =
            " documento_vencimento , documento , agrupamento_documento ";

        try {
            return pesquisarVO(connection, documentoVecimentoAgrupadoVO, where,
                tabelas, DocumentoVecimentoAgrupadoVO.EXCLUIDAS);
        } finally {
            if (key == null) {
                liberaConeccao(connection);
            }
        }
    }

    public void apagarDocumentoVencimento(Object key,
        Documento_vencimento documento_vencimento)
        throws ErroPadrao, SQLException, Exception {
        excluirVO(validarTransacao(key), documento_vencimento);
    }

    public void atualizaVencimento(Object key,
        Documento_vencimento documento_vencimento) {
        // TODO Auto-generated method stub
    }

    public List obterVencimentoAgrupador(Object key,
        DocumentoVecimentoAgrupadoVO documentoVecimentoAgrupadoVO)
        throws Exception {
        Connection connection = null;

        if (key == null) {
            connection = getConexao();
        } else {
            connection = validarTransacao(key);
        }

        String where =
            " and dcve_id = docm_id and apdo_doc_agrupador = docm_id ";
        String tabelas =
            " documento_vencimento , documento , agrupamento_documento ";

        try {
            return pesquisarVO(connection, documentoVecimentoAgrupadoVO, where,
                tabelas, DocumentoVecimentoAgrupadoVO.EXCLUIDAS);
        } finally {
            if (key == null) {
                liberaConeccao(connection);
            }
        }
    }

    public void inserirDocumentoVencimento(Object key,
        Documento_vencimento documento_vencimento) throws Exception {
        Connection connection = validarTransacao(key);
        inserirVO(connection, documento_vencimento);
    }
}
